
Pour rendre une application vivante, rien de tel qu'un peu d'animation...
Ce tutorial utilise une approche code-behind où toute la logique est directement dans le fichier XAML.CS.



Éléments clés:
BoxView nommé "box" qui sera l'élément animéSwitch pour activer/désactiver la rotation avec le gestionnaire OnRotationToggledButton pour déplacer à gauche/droite avec OnMoveLeft/OnMoveRightSlider pour ajuster la vitesse avec OnSpeedChangedPour la partie XAML.CS, on procède ainsi:
Exemple de structure:
public partial class AnimationPage : ContentPage
{
private bool rotationActive = false;
private double currentX = 0;
private uint animationSpeed = 500; // Vitesse en millisecondes
public AnimationPage()
{
InitializeComponent();
// Démarrer la rotation continue si activée
RotateContinuously();
}
// Gestionnaire pour le switch de rotation
private void OnRotationToggled(object sender, ToggledEventArgs e)
{
rotationActive = e.Value;
}
// Rotation continue en arrière-plan
private async void RotateContinuously()
{
while (true)
{
if (rotationActive)
{
await box.RotateTo(box.Rotation + 90, animationSpeed);
}
await Task.Delay(100);
}
}
// Déplacement vers la gauche
private async void OnMoveLeft(object sender, EventArgs e)
{
currentX -= 50;
await box.TranslateTo(currentX, 0, animationSpeed);
}
// Déplacement vers la droite
private async void OnMoveRight(object sender, EventArgs e)
{
currentX += 50;
await box.TranslateTo(currentX, 0, animationSpeed);
}
// Ajustement de la vitesse
private void OnSpeedChanged(object sender, ValueChangedEventArgs e)
{
animationSpeed = (uint)(51 - e.NewValue) * 10; // Inversion pour que plus = plus rapide
speedLabel.Text = $"Speed {(int)e.NewValue}";
}
}
Voici l'implémentation complète des différentes parties du code-behind:
public partial class AnimationPage : ContentPage
{
private bool rotationActive = false;
private double currentX = 0;
private uint animationSpeed = 500;
}
Ces variables permettent de:
rotationActive: Suivre si la rotation est activée ou noncurrentX: Mémoriser la position horizontale actuelle de la BoxViewanimationSpeed: Contrôler la vitesse des animations (en millisecondes)public AnimationPage()
{
InitializeComponent();
// Démarrer la boucle de rotation en arrière-plan
RotateContinuously();
}
private async void RotateContinuously()
{
while (true)
{
if (rotationActive)
{
// Rotation de 90 degrés à chaque itération
await box.RotateTo(box.Rotation + 90, animationSpeed);
}
// Petite pause pour éviter de surcharger le CPU
await Task.Delay(100);
}
}
Points importants:
RotateContinuously() tourne en boucle infinie (while(true))rotationActive est vrai pour animer ou pasbox.Rotation + 90 pour tourner de 90° supplémentairesTask.Delay(100) évite de surcharger le thread UIprivate void OnRotationToggled(object sender, ToggledEventArgs e)
{
rotationActive = e.Value;
}
Cette méthode est appelée quand l'utilisateur change l'état du switch. Elle met simplement à jour la variable rotationActive, et la boucle RotateContinuously() réagira automatiquement.
private async void OnMoveLeft(object sender, EventArgs e)
{
currentX -= 50;
await box.TranslateTo(currentX, 0, animationSpeed);
}
private async void OnMoveRight(object sender, EventArgs e)
{
currentX += 50;
await box.TranslateTo(currentX, 0, animationSpeed);
}
Fonctionnement:
OnMoveLeft: Décrémente la position X de 50 pixels puis anime le déplacementOnMoveRight: Incrémente la position X de 50 pixels puis anime le déplacementTranslateTo(x, y, duration): API MAUI pour animer une translationanimationSpeed pour respecter la vitesse choisieprivate void OnSpeedChanged(object sender, ValueChangedEventArgs e)
{
// Inversion: slider à 50 = vitesse max (100ms), slider à 1 = vitesse min (500ms)
animationSpeed = (uint)(51 - e.NewValue) * 10;
// Mise à jour du label pour afficher la valeur du slider
speedLabel.Text = $"Speed {(int)e.NewValue}";
}
Explication du calcul:
(51 - e.NewValue) inverse la valeur: slider=50 → 1, slider=1 → 50Suite à cet exercice, les compétences suivantes ont été travaillées:
RotateTo, TranslateTo)while(true) et Task.Delay()